package projetolp2.MealPoints;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

//ATEN��O! OS TIPOS DE ARRAY NAO SAO ARRAYLIST E SIM LIST... POIS LIST ABRANJE UM MAIOR TIPO DE COLECOES E CORRE MENOS RISCO DE ACONTECER ERROS
// PORTANTO NAO COLOQUE ARRAYLIST!!!!!!
public class Arquivo {
	
	String[] dadosEstabelecimentos, votos;
	List<Estabelecimento> listaEstabelecimentos = new ArrayList<Estabelecimento>(); 
	List<Opiniao> listaOpinioes = new ArrayList<Opiniao>(); 
	List<Usuario> listaUsuarios = new ArrayList<Usuario>(); 
	
	Estabelecimento estabelecimentoCorrente;
	Opiniao opiniao;
	Usuario usuario;
	Endereco endereco;
	TipoDeAlmoco tipoAlmoco;
	TipoDeEstabelecimento tipoEstabelecimento;
	String almocoArquivo;
	
	public Arquivo(){
		//construtor vazio
	}
	
	private String lerArquivo(String arquivo)throws FileNotFoundException, IOException {
			String arq = "";
			File file = new File(arquivo);

			if (! file.exists()) {
			return null;
			}

			BufferedReader br = new BufferedReader(new FileReader(arquivo));
			StringBuffer bufSaida = new StringBuffer();

			String linha;
			while( (linha = br.readLine()) != null ){
			bufSaida.append(linha + "\n");  // tirei o comentário!
				arq += linha + "\n";
			}
			br.close();
//			return bufSaida.toString();
			return arq;
			
	}
	/**
	 * @return
	 * 		Lista todos os estabelecimentos do arquivo
	 * @throws Exception 
	 */
	public List<Estabelecimento> listaEstabelecimentos()throws Exception {
		String arquivo = lerArquivo("lista_estabelecimentos_projeto_lp2editado.txt");
		
		String dados = lerArquivo(arquivo);
		String[] linhasArquivo = dados.split("\n");	
		
		for (String linha : linhasArquivo){
			//armazenando objetos do tipo Estabelecimento com os parametros lidos no arquivo
			dadosEstabelecimentos = linha.split(";");
			endereco = new Endereco(dadosEstabelecimentos[1]);
			
			almocoArquivo = dadosEstabelecimentos[2];
			if (almocoArquivo.equals(TipoDeAlmoco.A_LACARTE)){
				tipoAlmoco = TipoDeAlmoco.A_LACARTE;
			}else if (almocoArquivo.equals(TipoDeAlmoco.PRATO_FEITO)){
				tipoAlmoco = TipoDeAlmoco.PRATO_FEITO;
			}else if (almocoArquivo.equals(TipoDeAlmoco.SELF_SERVICE)){
				tipoAlmoco = TipoDeAlmoco.SELF_SERVICE;
			}else{
				throw new Exception("Tipo de almoco nao encontrado");
			}
			
			estabelecimentoCorrente = new Estabelecimento(dadosEstabelecimentos[0], endereco, tipoAlmoco, tipoEstabelecimento,0); 
			listaEstabelecimentos.add(estabelecimentoCorrente);
		}
		return listaEstabelecimentos;
	}
	
	/**
	 * @return
	 * 		Retorna todos os estabelecimentos, linha apos linha
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public String lerEstabelecimentos()throws FileNotFoundException, IOException {
		String arquivo = lerArquivo("arquivos/lista_estabelecimentos_projeto_lp2editado.txt");
		
		return arquivo;
		}
	
	
	
	/**
	 * @param usuario
	 * 		Nome do usuario a pesquisar
	 * @return
	 * 		Retorna todas as opnioes do usuario a pequisar
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public String opinioesUsuario(String usuario)throws FileNotFoundException, IOException {
		String[] arq = lerArquivo("opinioes_dos_usuarios_projeto_lp2editado.txt").split("\n");
		String opinioes = "";
		
		for(String i : arq){
			System.out.println(i.split(";")[1]+"    ------------     "+ usuario);
			if (i.split(";")[1].equals(usuario));
				opinioes = i;
				break;
		}
		return opinioes;
	}
	
	public List<Opiniao> listaOpinioesUsuarios() throws FileNotFoundException, IOException{
		String[] arquivo = lerArquivo("opinioes-dos-usuarios-v1editado.txt").split("\n");
		for (String linha : arquivo){
			votos = linha.split(";");
			List<OpinioesDeUsuarios> listaVotos = new ArrayList<OpinioesDeUsuarios>(); 
		
			//recebendo os votos do usuario
			for(int i= 2; i < votos.length; i++){
				if (votos[i].equals("-5: Detesto")){
					listaVotos.add(OpinioesDeUsuarios.DETESTO);
				}
				else if (votos[i].equals("-4: Acho muito ruim")){
					listaVotos.add(OpinioesDeUsuarios.MUITO_RUIM);
				}
				else if (votos[i].equals("-3: Acho bastante ruim")){
					listaVotos.add(OpinioesDeUsuarios.BASTANTE_RUIM);
				}
				else if (votos[i].equals("-2: Acho ruim")){
					listaVotos.add(OpinioesDeUsuarios.RUIM);
				}
				else if (votos[i].equals("-1: Acho um pouco ruim")){
					listaVotos.add(OpinioesDeUsuarios.UM_POUCO_RUIM);
				}
				else if (votos[i].equals("0 : Não conheço")){
					listaVotos.add(OpinioesDeUsuarios.NAO_CONHECO);
				}
				else if (votos[i].equals("1 : Não é ruim")){
					listaVotos.add(OpinioesDeUsuarios.NAO_EH_RUIM);
				}
				else if (votos[i].equals("2 : É bonzinho")){
					listaVotos.add(OpinioesDeUsuarios.BONZINHO);
				}
				else if (votos[i].equals("3: Bastante bom")){
					listaVotos.add(OpinioesDeUsuarios.BASTANTE_BOM);
				}
				else if (votos[i].equals("4: Muito bom")){
					listaVotos.add(OpinioesDeUsuarios.MUITO_BOM);
				}
				else if (votos[i].equals("5: Incrível, sensacional, impressionante")){
					listaVotos.add(OpinioesDeUsuarios.INCRIVEL);
				}
				
			}	
			opiniao = new Opiniao(votos[0],(ArrayList) listaVotos); 
			listaOpinioes.add(opiniao);
		}
		return listaOpinioes;
	}
	
	public List<Usuario> listaUsuarios() throws Exception{
		String[] arquivo = lerArquivo("opinioes-dos-usuarios-v1editado.txt").split("\n");
		for (String linha : arquivo){
			votos = linha.split(";");
			
			usuario = new Usuario(votos[1]); 
			listaUsuarios.add(usuario);
		}
		
		return listaUsuarios;
	}
	
	public String nomeUsuarios() throws Exception{
		List<Usuario> usuarios = listaUsuarios();
		String saida = "";
		for (Usuario user : usuarios){
			saida+= user.getNome() + "\n";
		}
		return saida;
	}
	
	public String nomeEstabelecimentos() throws Exception{
		List<Estabelecimento> estabelecimentos = lerEstabelecimentos();
		String saida = "";
		for (Estabelecimento est : estabelecimentos){
			saida+= est.getNome() + "\n";
		}
		return saida;
	}
}

